package ar.com.arkios.kfcon4d.dao;

import ar.com.arkios.kfcon4d.util.EstructuraUtil;
import ar.com.arkios.kfcon4d.util.RegisterBuilder;
import ar.com.arkios.kfconmodelo.modelo.Especie;
import ar.com.arkios.j4d.opDataArray;
import java.util.List;
import org.apache.log4j.Logger;

/**
 * <p>
 * 
 * </p>
 */
public class EspecieDAO extends GenericDAO<Especie> {
    
    private static final Logger miLogger = Logger.getLogger(EspecieDAO.class);
    
    /** Nombre de la tabla Especies */
    private static final String ESPECIES = "Especies";
    
    /** Nombre de la tabla EspeciesAtributos */
    private static final String ESPECIES_ATTR = "EspeciesAtributos";
    
    // Columnas de la tabla Especies
    private static final String ESPECIES_COD = "Cod";
    private static final String ESPECIES_NOM = "Nombre";
    
    // Columnas de la tabla EspeciesAtributos
    private static final String ESPECIES_ATTR_COD = "Especie";
    private static final String ESPECIES_ATTR_ENTE = "Ente";
    private static final String ESPECIES_ATTR_AT1 = "Atributo1";
    private static final String ESPECIES_ATTR_AT2 = "Atributo2";
    private static final String ESPECIES_ATTR_AT3 = "Atributo3";
    private static final String ESPECIES_ATTR_AT4 = "Atributo4";
    
    /** Nombres de las columnas a ser utilizadas de la tabla Especies. */
    private static final String[] ESPECIES_COLUMNAS = {ESPECIES_COD, ESPECIES_NOM};
    
    /** Nombres de las columnas a ser utilizada como PK de Especies. */
    private static final String[] ESPECIES_PK = {ESPECIES_COD};
    
    /** Nombres de las columnas a ser utilizadas de la tabla EspeciesAtributos. */
    private static final String[] ESPECIES_ATTR_COLUMNAS = {ESPECIES_ATTR_COD, ESPECIES_ATTR_ENTE, ESPECIES_ATTR_AT1, ESPECIES_ATTR_AT2, ESPECIES_ATTR_AT3, ESPECIES_ATTR_AT4};

    /** Nombres de las columnas a ser utilizada como PK de EspeciesAtributos. */
    private static final String[] ESPECIES_ATTR_PK = {ESPECIES_ATTR_COD};
    

    @Override
    protected String getEntidadTableName() {
        return ESPECIES;
    }

    @Override
    protected String getEntidadAtributoTableName() {
        return ESPECIES_ATTR;
    }

    @Override
    protected String getPKProperty() {
        return "miCodigo";
    }

    @Override
    protected opDataArray[] mapListEntidadTo4D(List<Especie> laLista) {
        opDataArray[] losDatosEspecies = new opDataArray[getMiEntidadFields().mSize];

        for (int i = 0; i < losDatosEspecies.length; i++) {
            losDatosEspecies[i] = new opDataArray(laLista.size());
        }

        int i = 0;
        for (Especie especie : laLista) {            
            RegisterBuilder especiesRegisterBuilder = new RegisterBuilder(getMiEntidadFields());
            especiesRegisterBuilder.setData(ESPECIES_COD, especie.getMiCodigo());
            especiesRegisterBuilder.setData(ESPECIES_NOM, especie.getMiNombre());
            
            opDataArray dataAux = especiesRegisterBuilder.getDataArray();
            for (int j = 0; j < getMiEntidadFields().mSize; j++) {
               losDatosEspecies[j].mDataArray[i] = dataAux.mDataArray[j];
            }
            i += 1;
        }
        return losDatosEspecies;
    }

    @Override
    protected opDataArray[] mapListEntidadAtributosTo4D(List<Especie> laLista) {
        opDataArray[] losDatosEspeciesAtributos = new opDataArray[getMiEntidadAtributosFields().mSize];

        for (int i = 0; i < losDatosEspeciesAtributos.length; i++) {
            losDatosEspeciesAtributos[i] = new opDataArray(laLista.size());
        }

        int i = 0;
        for (Especie especie : laLista) {            
            RegisterBuilder especiesAtributosRegisterBuilder = new RegisterBuilder(getMiEntidadAtributosFields());
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_COD, especie.getMiCodigo());
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_ENTE, EstructuraUtil.SAP);
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_AT1, especie.getMiDescripcionCastellano());
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_AT2, especie.getMiDescripcionIngles());
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_AT3, especie.getMiDescripOrganicaCastellano());
            especiesAtributosRegisterBuilder.setData(ESPECIES_ATTR_AT4, especie.getMiDescripOrganicaIngles());
            
            opDataArray dataAux = especiesAtributosRegisterBuilder.getDataArray();
            for (int j = 0; j < getMiEntidadAtributosFields().mSize; j++) {
               losDatosEspeciesAtributos[j].mDataArray[i] = dataAux.mDataArray[j];
            }
            i += 1;
        }
        return losDatosEspeciesAtributos;
    }
    
    @Override
    protected String[] getEntidadFieldsNames(){
        return ESPECIES_COLUMNAS;
    }
    
    @Override
    protected String[] getEntidadAtributosFieldsNames() {
        return ESPECIES_ATTR_COLUMNAS;
    }
    
    @Override
    protected String[] getEntidadPKFieldsNames(){
        return ESPECIES_PK;
    }
    
    @Override
    protected String[] getEntidadAtributosPKFieldsNames() {
        return ESPECIES_ATTR_PK;
    }
}